--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
sbapp/pyogg/flac_file.py f8b3e3760b831745cf10d97aeae64e9c00a136a9 (f8b3e376) Text, 4.35 KB
Tff7b72import T7ee787ctypes
Tff7b72from T7ee787itertools Tff7b72import Te6edf3chain
Tff7b72from T7ee787. Tff7b72import Te6edf3flac
Tff7b72from T7ee787.T7ee787audio_file Tff7b72import Te6edf3AudioFile
Tff7b72from T7ee787.T7ee787pyogg_error Tff7b72import Te6edf3PyOggError
Tff7b72def Td2a8ff_to_char_pTb4b4b4(Te6edf3stringTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72return Te6edf3ctypesTff7b72.Td2a8ffc_char_pTb4b4b4(Te6edf3stringTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72exceptTb4b4b4:
Tff7b72return Te6edf3ctypesTff7b72.Td2a8ffc_char_pTb4b4b4(Te6edf3stringTb4b4b4)
Tff7b72def Td2a8ff_resize_arrayTb4b4b4(Te6edf3arrayTb4b4b4, Te6edf3new_sizeTb4b4b4)Tb4b4b4:
Tff7b72return Tb4b4b4(Te6edf3arrayTff7b72.Td2a8ff_type_Tff7b72*Te6edf3new_sizeTb4b4b4)Tff7b72.Td2a8fffrom_addressTb4b4b4(Te6edf3ctypesTff7b72.Td2a8ffaddressofTb4b4b4(Te6edf3arrayTb4b4b4)Tb4b4b4)
Tff7b72class T56d364FlacFileTb4b4b4(Te6edf3AudioFileTb4b4b4)Tb4b4b4:
Tff7b72def Td2a8ffwrite_callbackTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3decoderTb4b4b4, Te6edf3frameTb4b4b4, Te6edf3bufferTb4b4b4, Te6edf3client_dataTb4b4b4)Tb4b4b4:
Te6edf3multi_channel_buf Tff7b72= Te6edf3_resize_arrayTb4b4b4(Te6edf3bufferTff7b72.Td2a8ffcontentsTb4b4b4, Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4)
Te6edf3arr_size Tff7b72= Te6edf3frameTff7b72.Td2a8ffcontentsTff7b72.Td2a8ffheaderTff7b72.Td2a8ffblocksize
Tff7b72if Te6edf3frameTff7b72.Td2a8ffcontentsTff7b72.Td2a8ffheaderTff7b72.Td2a8ffchannels Tff7b72>Tff7b72= T79c0ff2Tb4b4b4:
Te6edf3arrays Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(Te6edf3frameTff7b72.Td2a8ffcontentsTff7b72.Td2a8ffheaderTff7b72.Td2a8ffchannelsTb4b4b4)Tb4b4b4:
Te6edf3arr Tff7b72= Te6edf3ctypesTff7b72.Td2a8ffcastTb4b4b4(Te6edf3multi_channel_bufTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffPOINTERTb4b4b4(Te6edf3flacTff7b72.Td2a8ffFLAC__int32Tff7b72*Te6edf3arr_sizeTb4b4b4)Tb4b4b4)Tff7b72.Td2a8ffcontents
Te6edf3arraysTff7b72.Td2a8ffappendTb4b4b4(Te6edf3arrTb4b4b4[Tb4b4b4:Tb4b4b4]Tb4b4b4)
Te6edf3arr Tff7b72= Tffa657listTb4b4b4(Te6edf3chainTff7b72.Td2a8fffrom_iterableTb4b4b4(Tffa657zipTb4b4b4(Tff7b72*Te6edf3arraysTb4b4b4)Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffbufferTb4b4b4[Tff7b72selfTff7b72.Td2a8ffbuffer_pos Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffbuffer_pos Tff7b72+ Tffa657lenTb4b4b4(Te6edf3arrTb4b4b4)Tb4b4b4] Tff7b72= Te6edf3arrTb4b4b4[Tb4b4b4:Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffbuffer_pos Tff7b72+Tff7b72= Tffa657lenTb4b4b4(Te6edf3arrTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3arr Tff7b72= Te6edf3ctypesTff7b72.Td2a8ffcastTb4b4b4(Te6edf3multi_channel_bufTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffPOINTERTb4b4b4(Te6edf3flacTff7b72.Td2a8ffFLAC__int32Tff7b72*Te6edf3arr_sizeTb4b4b4)Tb4b4b4)Tff7b72.Td2a8ffcontents
Tff7b72selfTff7b72.Td2a8ffbufferTb4b4b4[Tff7b72selfTff7b72.Td2a8ffbuffer_pos Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffbuffer_pos Tff7b72+ Te6edf3arr_sizeTb4b4b4] Tff7b72= Te6edf3arrTb4b4b4[Tb4b4b4:Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffbuffer_pos Tff7b72+Tff7b72= Te6edf3arr_size
Tff7b72return T79c0ff0
Tff7b72def Td2a8ffmetadata_callbackTb4b4b4(Tff7b72selfTb4b4b4,Te6edf3decoderTb4b4b4, Te6edf3metadataTb4b4b4, Te6edf3client_dataTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffbufferTb4b4b4:
Tff7b72selfTff7b72.Td2a8fftotal_samples Tff7b72= Te6edf3metadataTff7b72.Td2a8ffcontentsTff7b72.Td2a8ffdataTff7b72.Td2a8ffstream_infoTff7b72.Td2a8fftotal_samples
Tff7b72selfTff7b72.Td2a8ffchannels Tff7b72= Te6edf3metadataTff7b72.Td2a8ffcontentsTff7b72.Td2a8ffdataTff7b72.Td2a8ffstream_infoTff7b72.Td2a8ffchannels
Te6edf3Buffer Tff7b72= Te6edf3flacTff7b72.Td2a8ffFLAC__int16Tff7b72*Tb4b4b4(Tff7b72selfTff7b72.Td2a8fftotal_samples Tff7b72* Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffbuffer Tff7b72= Te6edf3BufferTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fffrequency Tff7b72= Te6edf3metadataTff7b72.Td2a8ffcontentsTff7b72.Td2a8ffdataTff7b72.Td2a8ffstream_infoTff7b72.Td2a8ffsample_rate
Tff7b72def Td2a8fferror_callbackTb4b4b4(Tff7b72selfTb4b4b4,Te6edf3decoderTb4b4b4, Te6edf3statusTb4b4b4, Te6edf3client_dataTb4b4b4)Tb4b4b4:
Tff7b72raise Te6edf3PyOggErrorTb4b4b4(Ta5d6ff"Ta5d6ffAn error occured during the process of decoding. Status enum: Tffd700{}Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3flacTff7b72.Td2a8ffFLAC__StreamDecoderErrorStatusEnumTb4b4b4[Te6edf3statusTb4b4b4]Tb4b4b4)Tb4b4b4)
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3pathTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdecoder Tff7b72= Te6edf3flacTff7b72.Td2a8ffFLAC__stream_decoder_newTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffclient_data Tff7b72= Te6edf3ctypesTff7b72.Td2a8ffc_void_pTb4b4b4(Tb4b4b4)
T8b949e#: Number of channels in audio file.
Tff7b72selfTff7b72.Td2a8ffchannels Tff7b72= Tff7b72None
T8b949e#: Number of samples per second (per channel). For
T8b949e# example, 44100.
Tff7b72selfTff7b72.Td2a8fffrequency Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8fftotal_samples Tff7b72= Tff7b72None
T8b949e#: Raw PCM data from audio file.
Tff7b72selfTff7b72.Td2a8ffbuffer Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffbuffer_pos Tff7b72= T79c0ff0
Te6edf3write_callback_ Tff7b72= Te6edf3flacTff7b72.Td2a8ffFLAC__StreamDecoderWriteCallbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ffwrite_callbackTb4b4b4)
Te6edf3metadata_callback_ Tff7b72= Te6edf3flacTff7b72.Td2a8ffFLAC__StreamDecoderMetadataCallbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmetadata_callbackTb4b4b4)
Te6edf3error_callback_ Tff7b72= Te6edf3flacTff7b72.Td2a8ffFLAC__StreamDecoderErrorCallbackTb4b4b4(Tff7b72selfTff7b72.Td2a8fferror_callbackTb4b4b4)
Te6edf3init_status Tff7b72= Te6edf3flacTff7b72.Td2a8ffFLAC__stream_decoder_init_fileTb4b4b4(
Tff7b72selfTff7b72.Td2a8ffdecoderTb4b4b4,
Te6edf3_to_char_pTb4b4b4(Te6edf3pathTb4b4b4)Tb4b4b4, T8b949e# This will have an issue with Unicode filenames
Te6edf3write_callback_Tb4b4b4,
Te6edf3metadata_callback_Tb4b4b4,
Te6edf3error_callback_Tb4b4b4,
Tff7b72selfTff7b72.Td2a8ffclient_data
Tb4b4b4)
Tff7b72if Te6edf3init_statusTb4b4b4: T8b949e# error
Te6edf3error Tff7b72= Te6edf3flacTff7b72.Td2a8ffFLAC__StreamDecoderInitStatusEnumTb4b4b4[Te6edf3init_statusTb4b4b4]
Tff7b72raise Te6edf3PyOggErrorTb4b4b4(
Ta5d6ff"Ta5d6ffAn error occured when trying to open Ta5d6ff'Tffd700{}Ta5d6ff'Ta5d6ff: Tffd700{}Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3pathTb4b4b4, Te6edf3errorTb4b4b4)
Tb4b4b4)
Te6edf3metadata_status Tff7b72= Tb4b4b4(Te6edf3flacTff7b72.Td2a8ffFLAC__stream_decoder_process_until_end_of_metadataTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdecoderTb4b4b4)Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3metadata_statusTb4b4b4: T8b949e# error
Tff7b72raise Te6edf3PyOggErrorTb4b4b4(Ta5d6ff"Ta5d6ffAn error occured when trying to decode the metadata of Tffd700{}Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3pathTb4b4b4)Tb4b4b4)
Te6edf3stream_status Tff7b72= Tb4b4b4(Te6edf3flacTff7b72.Td2a8ffFLAC__stream_decoder_process_until_end_of_streamTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdecoderTb4b4b4)Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3stream_statusTb4b4b4: T8b949e# error
Tff7b72raise Te6edf3PyOggErrorTb4b4b4(Ta5d6ff"Ta5d6ffAn error occured when trying to decode the audio stream of Tffd700{}Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3pathTb4b4b4)Tb4b4b4)
Te6edf3flacTff7b72.Td2a8ffFLAC__stream_decoder_finishTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdecoderTb4b4b4)
T8b949e#: Length of buffer
Tff7b72selfTff7b72.Td2a8ffbuffer_length Tff7b72= Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffbufferTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffbytes_per_sample Tff7b72= Te6edf3ctypesTff7b72.Td2a8ffsizeofTb4b4b4(Te6edf3flacTff7b72.Td2a8ffFLAC__int16Tb4b4b4) T8b949e# See definition of Buffer in metadata_callback()
T8b949e# Cast buffer to one-dimensional array of chars
Te6edf3CharBuffer Tff7b72= Tb4b4b4(
Te6edf3ctypesTff7b72.Td2a8ffc_byte Tff7b72*
Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffbytes_per_sample Tff7b72* Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffbufferTb4b4b4)Tb4b4b4)
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffbuffer Tff7b72= Te6edf3CharBufferTff7b72.Td2a8fffrom_bufferTb4b4b4(Tff7b72selfTff7b72.Td2a8ffbufferTb4b4b4)
T8b949e# FLAC audio is always signed. See
T8b949e# https://xiph.org/flac/api/group__flac__stream__decoder.html#gaf98a4f9e2cac5747da6018c3dfc8dde1
Tff7b72selfTff7b72.Td2a8ffsigned Tff7b72= Tff7b72True
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────